// 将一个函数 拆分成多个函数
// 缩小适用范围
function checkType(type) {
  return (content) => {
    return Object.prototype.toString.call(content) === `[object ${type}]`
  }
}
let isString = checkType('String')

console.log(isString('xxx'))

// 柯里化 怎么实现
function checkType2(type,  content) {
  return Object.prototype.toString.call(content) === `[object ${type}]`
}

function curry(fn, arr) {
  return (...arg) => {
    arr = arr.concat(arg)
    if(fn.length <= arr.length) {
     return fn(...arr)
    }else{
      return curry(fn, arr)
    }
  }
}

// 反柯里化
// 而反柯里化，从字面讲，意义和用法跟函数柯里化相比正好相反，扩大适用范围，创建一个应用范围更广的函数。使本来只有特定对象才适用的方法，扩展到更多的对象。

Function.prototype.unCurrying = function() {
  const self = this                        // 这里的self就是Array.prototype.push方法
  return function(...rest) {              // rest为传入的两层参数[[1,2,3],4]
    return Function.prototype.call.apply(self, rest)
  }
}
const push = Array.prototype.push.unCurrying()
const obj = { a: '嘻嘻' }
push(obj, '呵呵', '哈哈', '嘿嘿')

// 跟这个差不多
const obj = { a: '嘻嘻' }
Array.prototype.push.call(obj, '12')
console.log(obj)